/*********************************************************************************************************
**
**                                   GJB 标准测试集
**
**                               Copyright All Rights Reserved
**
**--------------文件信息--------------------------------------------------------------------------------
**
** 文   件   名: gjb_S0100901GN_3.c
**
** 文件创建日期: 2021 年 1 月 22 日
**
** 描        述: 初始化、销毁条件变量功能测试
*********************************************************************************************************/
#include <pthread.h>
#include <stdio.h>
#include <errno.h>
#include <limits.h>
#include <string.h>
//#include "gjb.h"

#define TEST_UINT_MAX 3100
pthread_cond_t  cond_cv_9013[3100];


int gjb_S0100901GN_3(int argc, char **argv)
{
    int rc;
    int i;

    /*
     *  初始化cond数组
     */
    memset(cond_cv_9013, 0, 3100*sizeof(pthread_cond_t));

    for (i = 0; ; i++) {

        /*
         *  条件变量初始化
         */
        rc = pthread_cond_init(&(cond_cv_9013[i]),NULL);

        if (rc != 0) {
            if (rc == EAGAIN){
                printf("Test pass。 times %d\n",i);
                break;
            } else{
                printf("test failed.pthread_cond_init should return EAGAIN,but return %d,times %d",rc,i);
                for(;i>=0;i--) {
                    pthread_cond_destroy(&(cond_cv_9013[i]));
                }
                goto __errno_handle;
            }

        } else {
            if(i>TEST_UINT_MAX) {
                printf("pthread_cond_init sill return successful even i>UINT_MAX,i=%d. test failed.\n",i);
                for(;i>=0;i--) {
                    pthread_cond_destroy(&(cond_cv_9013[i]));
                }
                goto __errno_handle;
            }
        }
    }

    for(;i>=0;i--) {
        if (rc != 0) {
            pthread_cond_destroy(&(cond_cv_9013[i]));                           /*  条件变量的删除              */
        }
    }

    printf("<RSLT>..................................................[(0)]\n \n \n");

    return  (0);
__errno_handle:
    printf("<RSLT>..................................................[(-1)]\n \n \n");
    return  (-1);
}



